/**
 * Copyright (C) 2011 Angelo Zerr <angelo.zerr@gmail.com> and Pascal Leclercq <pascal.leclercq@gmail.com>
 *
 * All rights reserved.
 *
 * Permission is hereby granted, free  of charge, to any person obtaining
 * a  copy  of this  software  and  associated  documentation files  (the
 * "Software"), to  deal in  the Software without  restriction, including
 * without limitation  the rights to  use, copy, modify,  merge, publish,
 * distribute,  sublicense, and/or sell  copies of  the Software,  and to
 * permit persons to whom the Software  is furnished to do so, subject to
 * the following conditions:
 *
 * The  above  copyright  notice  and  this permission  notice  shall  be
 * included in all copies or substantial portions of the Software.
 *
 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
 * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package fr.opensagres.xdocreport.itext.extension;

import java.awt.Color;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import junit.framework.TestCase;

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPCellEvent;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;


public class ExtendedParagraphTestCase extends TestCase {

	public void testExtendedParagraph() {

		Document document = new Document();
		try {
			PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
			document.open();

			// Simple border
			ExtendedParagraph p1 = new ExtendedParagraph();
			//BaseFont.createFont(BaseFont.TIMES_ROMAN, encoding, embedded)
			
			p1.setFont(FontFactory.getFont(BaseFont.TIMES_ROMAN, 10f, Font.BOLD, Color.BLUE));
			//p1.setFont(new Font(FontFamily.TIMES_ROMAN, 10f, Font.BOLD, Color.BLUE));
			p1.getPdfPCell().setBorder(
					Rectangle.BOX);
			p1.add(new Chunk("Title 1"));
			document.add(p1.getContainer());

			Paragraph separator = new Paragraph();
			separator.add(Chunk.NEWLINE);
			document.add(separator);

			// Custom border
			ExtendedParagraph p2 = new ExtendedParagraph();
			p2.getPdfPCell().setCellEvent(
					new RoundRectangle(new int[] { 0xFF, 0x00, 0xFF, 0x00 }));
			p2.add(new Chunk("Title 2"));
			document.add(p2.getContainer());

			separator = new Paragraph();
			separator.add(Chunk.NEWLINE);
			document.add(separator);

			// Chapter title with border + style
			ExtendedParagraph title = new ExtendedParagraph();		
			
			title.setFont(FontFactory.getFont(BaseFont.TIMES_ROMAN, 10f, Font.BOLD, Color.BLUE));
			//title.setFont(new Font(FontFamily.TIMES_ROMAN, 10f, Font.BOLD, Color.BLUE));
			title.add(new Chunk("Chapter 1"));

			ExtendedChapter chapter1 = new ExtendedChapter(title, 1);
			chapter1.setTriggerNewPage(false);
			chapter1.getPdfPCell().setBorder(
					Rectangle.BOTTOM | Rectangle.TOP | Rectangle.LEFT
							| Rectangle.RIGHT);			
			chapter1.add(new Paragraph("bla bla bla"));
			
			// Section title with border
			ExtendedSection section1 = (ExtendedSection)chapter1.addSection("Section 1.1");			
			section1.getPdfPCell().setBorder(
					Rectangle.BOTTOM | Rectangle.TOP | Rectangle.LEFT
							| Rectangle.RIGHT);
			section1.add(new Paragraph("bla bla bla"));
			
			document.add(chapter1);

			separator = new Paragraph();
			separator.add(Chunk.NEWLINE);
			document.add(separator);

			// Chapter AutoNumber title with border
			ExtendedChapterAutoNumber chapterAutoNumber1 = new ExtendedChapterAutoNumber("Chapter-Auto 1");
			chapterAutoNumber1.setTriggerNewPage(false);
			chapterAutoNumber1.getPdfPCell().setBorder(
					Rectangle.BOTTOM | Rectangle.TOP | Rectangle.LEFT
							| Rectangle.RIGHT);

			// Section AutoNumber title with border
			ExtendedSection sectionAutoNumber1 = (ExtendedSection)chapter1.addSection("Section-Auto 1.1");			
			sectionAutoNumber1.getPdfPCell().setBorder(
					Rectangle.BOTTOM | Rectangle.TOP | Rectangle.LEFT
							| Rectangle.RIGHT);
			
			document.add(chapterAutoNumber1);

			document.close();

		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (DocumentException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

	/**
	 * Inner class with a cell event that draws a border with rounded corners.
	 */
	class RoundRectangle implements PdfPCellEvent {
		/** the border color described as CMYK values. */
		protected int[] color;

		/** Constructs the event using a certain color. */
		public RoundRectangle(int[] color) {
			this.color = color;
		}

		public void cellLayout(PdfPCell cell, Rectangle rect,
				PdfContentByte[] canvas) {
			PdfContentByte cb = canvas[PdfPTable.LINECANVAS];
			cb.roundRectangle(rect.getLeft() + 1.5f, rect.getBottom() + 1.5f,
					rect.getWidth() - 3, rect.getHeight() - 3, 4);
			cb.setLineWidth(1.5f);
			cb.setCMYKColorStrokeF(color[0], color[1], color[2], color[3]);
			cb.stroke();
		}
	}

}
